#ifndef DEVICE_INFO_H
#define DEVICE_INFO_H

#include <stdint.h>


#define APP_VALID_FLAG 0x00000001
#define DEVICE_INFO_SIZE 0x40                                      // 64字节
#define DEVICE_INFO_ADDR (0x080C0000 + 0x40000 - DEVICE_INFO_SIZE) // 0x080FFFC0

#define FLASH_BASE ((uint32_t)0x08000000U)     /*!< FLASH基地址 */
#define SRAM_BASE ((uint32_t)0x20000000U)      /*!< SRAM基地址 */
#define RAM_START_ADDR SRAM_BASE               // RAM起始地址
#define SRAM_SIZE ((uint32_t)0x00080000U)      /*!< SRAM总大小 512KB */
#define RAM_END_ADDR SRAM_BASE + SRAM_SIZE - 1 // RAM结束地址（512KB）
// #define PERIPH_BASE            ((uint32_t)0x40000000U)     /*!< 外设基地址 */

#define FLASH_SIZE ((uint32_t)0x00100000U)        /*!< FLASH总大小 1024KB (1MB) */
#define FLASH_PAGE_SIZE ((uint32_t)0x00000800U)   /*!< FLASH页大小 2KB */
#define FLASH_SECTOR_SIZE ((uint32_t)0x00020000U) /*!< FLASH扇区大小 128KB */

#define FLASH_CODE_SIZE ((uint32_t)0x000C0000U) /*!< 代码区大小 768KB */
#define FLASH_DATA_SIZE ((uint32_t)0x00040000U) /*!< 数据区大小 256KB */

#define BOOTLOADER_SIZE ((uint32_t)0x00008000U) // BootLoader大小(32KB)

#define APP_SIZE_ADDR (FLASH_BASE + 0x4000)     // 存储APP大小的地址(16KB处)
#define APP_CHECKSUM_ADDR (APP_SIZE_ADDR + 4)   // 存储APP校验和的地址

#define APP_OFFSET (BOOTLOADER_SIZE)       /*!< APP偏移地址 32KB */
#define APP_START_ADDR (FLASH_BASE + APP_OFFSET) /*!< APP起始地址 0x08008000 */
#define APP_ADDR (APP_START_ADDR) // APP起始地址
#define APP_CODE_OFFSET (APP_START_ADDR)         // 应用程序起始地址（32KB后）

typedef struct
{
    uint32_t app_valid_flag; // APP有效标志 0x55AA55AA
    uint32_t app_size;       // APP大小
    uint32_t app_crc;        // APP的CRC校验值
    uint32_t app_version;    // APP版本号
    uint8_t device_id[16];   // 设备ID
    uint8_t reserve[32];     // 预留空间，保持总大小为64字节
} device_info_t;

#endif /* DEVICE_INFO_H */